//  TypeScript 基于javaScript之上的编程语言
//  解决了javaScript 类型系统的不足
//  使用 TypeScript可以大大提高代码的可靠程度
//  

// 强弱类型

// 类型安全角度分类，分为强类型和弱类型。
// 强类型不允许任意的隐式类型转化，在语言层面限制函数的实参类型必须与形参类型相同（Java类中的函数），弱类型则允许隐式类型转化，强类型有更强的类型约束，弱类型几乎没有什么约束


// 静态动态类型

// 类型检查角度分类分为静态类型和动态类型
// 静态类型：一个变量声明以后他的类型就是明确的，声明过后，它的类型不允许修改
// 动态类型：运行阶段才能够明确变量类型，而且变量类型也可以随时变化，变量是没有类型的，但是变量存放的值是有类型的。


//-----------------------------------------
// Flow
// 安装 使用
// npm install flow-bin   //安裝
// npm run flow init  //初始化配置文件
// npm run flow status 
// npm run flow check
// npm run flow stop


// @flow
//参数类型为number，返回值类型也为number
// function addSum:number(a:number,b:number){
//     return a+b
// }
// console.log(addSum(1,'2'))
// let num:number = 1   //变量


// yarn安装
// npm install -g yarn   // 全局安装
// yarn --version //查看系统版本 

// ------------------------------------

// const hello = (name: any) =>{
//     console.log(`Hello,${name}`)
// }

// hello('TypeScript')

//----------------------------------------------------
// 原始数据类型
// 标准库是内置对象所声明的文件
// 命令后面  加上 --locake zh-Cn  中文报错

// const a: string = 'foobar'

// const b: number = 100

// const c: boolean = true

// // const d: number = null 

// const e: void = undefined

// const f: null = null 

// const g: undefined = undefined

// const h: symbol = Symbol()

// const erroe: string = 100



//------------------------------
//作用域
// const a = 123

// export {}  
// 变成模块中的局部成员  不会跟其他页面产生冲突


//----------------------------
// Object 类型

// const foo: object = function(){} // [] {}
// const obj: { foo : number } = { foo : 123 }


//-------------------------------
// 数组类型
// const arr:number[] = {1,2,3}
// const arr1:Array<Number> = {1,2,3}

//------------------------------
//元祖类型
// const  tuple: [number,string] = [18,'123']


//---------------------------------
// 枚举类型
// enum MyStatus{
//     one=1,
//     two,
//     three
//    }
//console.log(MyStatus.three)



//-----------------------------------------
// 函数类型

// function add(num1:number,num2:number) :number{   
//     return num1+num2
// }  
// add(100,200)  //参数固定，类型固定

// function add1(num1:number,num2:number = 10) :number{   
//     return num1+num2
// }

// add1(1)



//----------------------------------------
// 任意类型

// function trans(str:any){
//     JSON.stringify(str)
// }



//---------------------------
// 隐式类型推断

// let tes = 18
// tes = '123' //报错，因为tes被隐式推断为了number，相当于已经定义了，let tes：number = 18

// let test2
// test2 = 18
// test2 = '123'
// 但是如果不声明变量的类型，并且不赋值，则类型为any,可以赋值任意类型的数据



//-------------------------
//接口   interface 
// 约定对象的结构,可选成员要添加？，只读成员，属性不能被修改，添加readonly
// interface Post {
// 	title: string
// 	content: string,
//     time?:string,
//     readonly name:string
// }

//-----------------------------------
// 类 class
// class Person {
// 	name: string
// 	number: number
// 	constructor(name: string,age:number) {
// 		this.name = name
// 		this.age =age
// 	}
// 	sayHi(mes: string):void {

// 	}
// }



//---------------------------------
// 访问修饰符
// public：默认修饰符 公有的
// private：私有的 类的内部访问 外部不能访问
// protected：受保护的 外部不能访问 允许子类访问